'use strict';

/**
 * @description 域名访问插件
 * @author Bluer_Dai
 * */

/**
 * @param {Array<string>} options 不需要检验登录的url数组
 */
module.exports = options => {
  return async (ctx, next) => {
    const url = ctx.request.url;
    const method = ctx.request.method.toUpperCase();
    // 如果请求的接口是不需要校验登录或者是公共资源 则不需要校验token是否有效
    if (options.exclude.includes(`${method} ${url.split('?')[0]}`) || url.startsWith('/public/uploads')) {
      await next();
      return;
    }
    // 获取请求的token
    const token = ctx.request.token;
    // 通过解密请求的token中的用户名获取redis中对应的token
    const redisToken = await ctx.app.redis.get(ctx.deviceType + ctx.userId);
    // 客户端token与redis中的token相比较
    const user = redisToken ? redisToken === token : redisToken;
    if (!user) {
      ctx.body = {
        status: 403,
        message: '用户未登录',
      };
    } else {
      await next();
    }
  };
};
